/**
 * 本题用TS来写
 *
 * 行程长度编码（RLE）是一种字符串压缩方法，其工作原理是通过将连续相同字符（重复两次或更多次）替换为字符重复次数（运行长度）和字符的串联。
 * 例如，要压缩字符串 "3322251" ，我们将 "33" 用 "23" 替换，将 "222" 用 "32" 替换，将 "5" 用 "15" 替换并将 "1" 用 "11" 替换。
 * 因此压缩后字符串变为 "23321511"。
 *
 * 题解
 * 1.本题意思是让我们实现外观数列功能，但前提是先实现行程长度编码功能
 * 2.假定我们的方法是countAndSay(n)。输入 1<=n<=30
 * 3.输入1，结果是"1"
 * 4.输入n，结果是countAndSay(n-1)的行程长度编码
 *
 *
 * 思路
 * 1.使用递归获取n-1的行程长度编码
 * 2.循环，依次获取行程长度编码，最终取得n-1的行程长度编码
 *
 * 行程长度编码实现思路
 * 1.设定数组，依次统计连续字符个数，最终拼接成字符串
 * 2.使用字符，设定num(目标字符个数)、target(目标字符)，依次拼接字符串
 */
function rle(string) {
    if (string.length == 1) {
        return "1" + string;
    }
    var result = ""; //行程长度编码
    var num = 1;
    var target = string[0];
    var currIndex = 1;
    while (true) {
        if (string[currIndex] != target || string.length == currIndex) {
            //将字符拼接
            result += num.toString() + target;
            //跳出循环
            if (string.length == currIndex) {
                break;
            }
            //重置
            target = string[currIndex];
            num = 1;
        }
        else {
            num++;
        }
        // console.log(`curr=${string[currIndex]},target="${target},currIndex="${currIndex},num="${num},result="${result}`);
        currIndex++;
    }
    return result;
}
// console.log(rle("3322251"));
/**
 * 数位字符串序列思路1
 */
function countAndSay(n) {
    if (n == 1) {
        return "1";
    }
    else {
        return rle(countAndSay(n - 1));
    }
}
;
console.log(countAndSay(4));
